home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 24 / AACD 24.iso / AACD / System / Safe / SMEGClones / SMEG2.asm < prev   
Assembly Source File  |  2001-07-31  |  10KB  |  646 lines

  1. ;
  2. ; Name        :    SMEG
  3. ; Description    :    XFD external slave to detect and remove SMEG viri
  4. ; Author    :    Zbigniew `Zeeball` Trzcionkowski
  5. ; Date        :    27.07.2001
  6. ; Version    :    2
  7. ; Supports    :    PENETRATOR (SMEG clone)
  8. ;                       SMEG2 (1556 bytes)
  9. ;                       SMEG2 (1604 bytes)
  10. ;
  11. ; In future    :    (more clones?)
  12. ; Disclaimer    :    The slave and this source are Public Domain.
  13. ; Comments    :    fixed hunk check to SMEG based :-)
  14. ;
  15. ; I TAKE NO RESPONSIBILITY FOR ANY DATALOSS CAUSED BY THIS SUBLIBRARY.
  16. ;
  17. ; USAGE: Use xfdDecrunch to clean whole directories.
  18. ;        I take no responisbility for this software,
  19. ;        and decrunched files that had to stay untouched :-)
  20. ;        This is xfdDecrunch not VirusZ!
  21.  
  22.  
  23.  
  24.     section    ZbL!,code
  25. ZbL:
  26.     moveq    #-1,d0        ;security
  27.     rts            ;ender
  28.     
  29.     dc.b    "XFDF"        ;XFDF_ID
  30.     dc.w    1,0
  31.     dc.l    0,0,Penetrator
  32.  
  33.     dc.b    "$VER: SMEG-CLONE 1 (12.07.01) by Zbigniew `Zeeball` Trzcionkowski",10,0
  34.  
  35.  
  36. Smeg1Name:    dc.b    "[PENETRATOR! virus]",0
  37. Smeg2Name:    dc.b    "[SMEG2 virus]",0    ;typ B
  38. Smeg3Name:    dc.b    "[SMEG2 virus]",0    ;typ A
  39.     even
  40.  
  41. Penetrator:
  42.         dc.l    SMG2        ;next slave
  43.         dc.w    2        ;version
  44.         dc.w    38        ;master version
  45.         dc.l    Smeg1Name    ;name
  46.         dc.w    0        ;XFDPFF_RELOC
  47.         dc.w    0
  48.         dc.l    RecogPEN    ;recog buffer
  49.         dc.l    RemPEN        ;decrunch buffer
  50.         dc.l    0        ;recog segment
  51.         dc.l    0        ;decrunch segment
  52.         dc.w    0,0        ;slave/replace id
  53.         dc.l    80        ;min. file length for header and data
  54.  
  55. SMG2:        dc.l    SMG        ;next slave
  56.         dc.w    2        ;version
  57.         dc.w    38        ;master version
  58.         dc.l    Smeg2Name    ;name
  59.         dc.w    0        ;XFDPFF_RELOC
  60.         dc.w    0
  61.         dc.l    RecogSMG2    ;recog buffer
  62.         dc.l    RemSMG2        ;decrunch buffer
  63.         dc.l    0        ;recog segment
  64.         dc.l    0        ;decrunch segment
  65.         dc.w    0,0        ;slave/replace id
  66.         dc.l    80        ;min. file length for header and data
  67.  
  68. SMG:        dc.l    0        ;next slave
  69.         dc.w    2        ;version
  70.         dc.w    38        ;master version
  71.         dc.l    Smeg3Name    ;name
  72.         dc.w    0        ;XFDPFF_RELOC
  73.         dc.w    0
  74.         dc.l    RecogSMG    ;recog buffer
  75.         dc.l    RemSMG        ;decrunch buffer
  76.         dc.l    0        ;recog segment
  77.         dc.l    0        ;decrunch segment
  78.         dc.w    0,0        ;slave/replace id
  79.         dc.l    80        ;min. file length for header and data
  80.  
  81.  
  82.  
  83. PEN_size    =    6796
  84.  
  85. RecogPEN:
  86.     movem.l    d2-d7/a0-a6,-(sp)
  87.     bsr.b    .dupa
  88.     movem.l    (sp)+,d2-d7/a0-a6
  89.     rts
  90.     
  91. .Dupa:
  92.     cmp.l    #$3f3,(a0)
  93.     bne    .no
  94.  
  95.     move.l    8(a0),d0
  96.     lsl.l    #2,d0
  97.  
  98.     lea.l    $14(a0,d0.l),a0
  99.  
  100.     cmp.w    #$3ea,2(a0)        ; DATA
  101.     beq.b    .okiej
  102.  
  103.     cmp.w    #$3e9,2(a0)        ; CODE
  104.     bne.b    .no
  105.  
  106. .okiej
  107.     addq.l    #4,a0
  108.     
  109.     move.l    (a0)+,d0        ;HUNKCODE len in longs
  110.  
  111.     add.l    d0,a0
  112.     add.l    d0,a0
  113.     add.l    d0,a0
  114.     add.l    d0,a0
  115.  
  116.     sub.l    #PEN_size,a0
  117.  
  118.     cmp.l    #$4eaefd84,40(a0)
  119.     bne.b    .no
  120.     cmp.l    #$4eaeff88,44(a0)
  121.     bne.b    .no
  122.     cmp.w    #$610c,48(a0)
  123.     bne.b    .no
  124.     cmp.l    #$4eaeff82,50(a0)
  125.     bne.b    .no
  126.     cmp.l    #$4cdf7fff,54(a0)
  127.     bne.b    .no
  128.  
  129. .Yes:
  130.     moveq    #1,d0
  131.     rts
  132. .no:
  133.     moveq    #0,d0
  134.     rts
  135.  
  136.  
  137.  
  138.  
  139. SMG_size2    =    1604
  140.  
  141. RecogSMG2:
  142.     movem.l    d2-d7/a0-a6,-(sp)
  143.     bsr.b    .dupa
  144.     movem.l    (sp)+,d2-d7/a0-a6
  145.     rts
  146.     
  147. .Dupa:
  148.     cmp.l    #$3f3,(a0)
  149.     bne    .no
  150.  
  151.  
  152.     move.l    8(a0),d0
  153.     lsl.l    #2,d0
  154.     lea.l    $14(a0,d0.l),a0
  155.  
  156.     cmp.w    #$3ea,2(a0)        ; DATA
  157.     beq.b    .okiej
  158.  
  159.     cmp.w    #$3e9,2(a0)        ; CODE
  160.     bne.b    .no
  161.  
  162. .okiej
  163.     addq.l    #4,a0
  164.  
  165.     move.l    (a0)+,d0        ;HUNKCODE len in longs
  166.  
  167.     add.l    d0,a0
  168.     add.l    d0,a0
  169.     add.l    d0,a0
  170.     add.l    d0,a0
  171.  
  172.     sub.l    #SMG_size2,a0
  173.  
  174.     cmp.l    #$4cdf7ffe,108(a0)
  175.     bne.b    .no
  176.     cmp.l    #$4a804e75,112(a0)
  177.     bne.b    .no
  178.     cmp.l    #$534d4700,116(a0)
  179.     bne.b    .no
  180.  
  181. .Yes:
  182.     moveq    #1,d0
  183.     rts
  184. .no:
  185.     moveq    #0,d0
  186.     rts
  187.  
  188.  
  189. SMG_size    =    1556
  190.  
  191. RecogSMG:
  192.     movem.l    d2-d7/a0-a6,-(sp)
  193.     bsr.b    .dupa
  194.     movem.l    (sp)+,d2-d7/a0-a6
  195.     rts
  196.  
  197. .Dupa:
  198.     cmp.l    #$3f3,(a0)
  199.     bne    .no
  200.  
  201.     move.l    8(a0),d0
  202.     lsl.l    #2,d0
  203.     lea.l    $14(a0,d0.l),a0
  204.  
  205.     cmp.w    #$3ea,2(a0)        ; DATA
  206.     beq.b    .okiej
  207.  
  208.     cmp.w    #$3e9,2(a0)        ; CODE
  209.     bne.b    .no
  210.  
  211. .okiej
  212.     addq.l    #4,a0
  213.  
  214.     
  215.     move.l    (a0)+,d0        ;HUNKCODE len in longs
  216.  
  217.     add.l    d0,a0
  218.     add.l    d0,a0
  219.     add.l    d0,a0
  220.     add.l    d0,a0
  221.  
  222.     sub.l    #SMG_size,a0
  223.  
  224.     cmp.l    #$4eaefd54,84(a0)
  225.     bne.b    .no
  226.     
  227.     cmp.l    #$4cdf7ffe,88(a0)
  228.     bne.b    .no
  229.     
  230.     cmp.l    #$4a804e75,92(a0)
  231.     bne.b    .no
  232.  
  233.     cmp.l    #$611067e4,96(a0)
  234.     bne.b    .no
  235.  
  236. .Yes:
  237.     moveq    #1,d0
  238.     rts
  239. .no:
  240.     moveq    #0,d0
  241.     rts
  242.  
  243.  
  244.  
  245. ;--------------------------------------------------------------------
  246. ;--------------------------------------------------------------------
  247. RemPEN:
  248.     movem.l    d2-d7/a0-a6,-(sp)
  249.  
  250.     moveq    #0,d0
  251.  
  252.     move.l    4(a0),d7        ; xfdbi_SourceBufLen
  253.  
  254.  
  255.     movem.l    d0-a6,-(sp)
  256.     move.l    a0,a6
  257.     move.l    0(a0),a0        ; xfdbi_SourceBuffer
  258.  
  259.  
  260.     move.l    8(a0),d0
  261.     lsl.l    #2,d0
  262.     lea.l    $14(a0,d0.l),a0
  263.  
  264.     cmp.w    #$3ea,2(a0)        ; DATA
  265.     beq.b    .okiej
  266.  
  267.     cmp.w    #$3e9,2(a0)        ; CODE
  268.     beq.b    .okiej
  269.  
  270.     movem.l    (sp)+,d0-a6
  271.     bra.w    .cant
  272.  
  273. .okiej:
  274.     addq.l    #4,a0
  275.  
  276.  
  277.     move.l    a0,a5            ; begin of codehunk
  278.  
  279.     ;****** CORRECT HUNKLENGTHs...
  280.  
  281.     move.l    0(a6),a0        ; xfdbi_SourceBuffer
  282.     lea.l    $14(a0),a0
  283.     sub.l    #PEN_size/4,(a0)
  284.     sub.l    #PEN_size/4,(a5)
  285.  
  286.     ;****** REPLACE STOLEN INSTRUCTION...
  287.  
  288.     move.l    #$61000002,d1
  289.  
  290.     move.l    a5,a0
  291.     add.l    (a5),a0
  292.     add.l    (a5),a0
  293.     add.l    (a5),a0
  294.     add.l    (a5),a0
  295.  
  296.     move.l    #$4eae0000,d4
  297.     move.w    64(a0),d4    
  298.  
  299.     move.l    a5,a2            ; BeginOfCodeHunk
  300.  
  301. .restore
  302.     move.l    (a0),d2
  303.     cmp.l    d1,d2
  304.     bne    .none
  305.     
  306.     move.l    d4,(a0)            ; restore JSR XXX(a6)
  307.  
  308. .none
  309.     addq.l    #2,d1
  310.     subq.l    #2,a0
  311.     cmpa.l    a0,a2
  312.     bne    .restore
  313.  
  314.     ;****** MAKE CLEAN COPY...
  315.  
  316.  
  317.     move.l    4(a6),a2        ; xfdbi_SourceBufLen
  318.     sub.l    #PEN_size,a2
  319.     add.l    0(a6),a2        ; xfdbi_SourceBuffer
  320.  
  321.     move.l    a5,a0            ; before
  322.     move.l    (a5),d0
  323.     lsl.l    #2,d0
  324.     add.l    d0,a0
  325.     lea.l    PEN_size(a0),a1    ; after
  326.     addq.l    #4,a1
  327.     addq.l    #4,a0
  328.  
  329. .copy:
  330.     move.l    (a1)+,(a0)+
  331.     cmp.l    a0,a2
  332.     bge.b    .copy
  333.  
  334.     movem.l    (sp)+,d0-a6
  335.  
  336.  
  337.     move.l    4(a0),d0    ; xfdbi_SourceBufLen
  338.     sub.l    #PEN_size,d0
  339.     move.l    d0,32(a0)    ; xfdbi_TargetBufSaveLen
  340.  
  341.     move.l    60(a0),a1    ; xfdbi_UserTargetBuf
  342.  
  343.     btst.b    #3,49(a0)    ; XFDFB_USERTARGET,1+xfdbi_Flags
  344.     bne.b    .CopyMem
  345.  
  346.     move.w    #1,18(a0)    ; XFDERR_NOMEMORY,xfdbi_Error
  347.  
  348.     move.l    d0,28(a0)    ; xfdbi_TargetBufLen
  349.  
  350.     move.l    4.w,a6        ; execbase
  351.     
  352.     move.l    24(a0),d1    ; xfdbi_TargetBufMemType
  353.     
  354.     move.l    a0,-(sp)
  355.     jsr    -198(a6)    ; AllocMem
  356.     move.l    (sp)+,a0
  357.  
  358.     move.l    d0,a1
  359.     move.l    d0,20(a0)    ; xfdbi_TargetBuffer
  360.     beq.b    .Cant
  361.  
  362.  
  363. .CopyMem:
  364.     clr.w    18(a0)        ; xfdbi_Error
  365.     
  366.     move.l    32(a0),d0    ; xfdbi_TargetBufSaveLen
  367.     move.l    0(a0),a0    ; xfdbi_SourceBuffer
  368.     jsr    -624(a6)    ; CopyMem
  369.  
  370.  
  371.     moveq    #1,d0
  372.     movem.l    (sp)+,d2-d7/a0-a6
  373.     rts
  374.  
  375.  
  376. .cant:
  377.     movem.l    (sp)+,d2-d7/a0-a6
  378.     rts
  379.  
  380.  
  381.  
  382. ;--------------------------------------------------------------------
  383. ;--------------------------------------------------------------------
  384.  
  385.  
  386. RemSMG2:
  387.     movem.l    d2-d7/a0-a6,-(sp)
  388.  
  389.     moveq    #0,d0
  390.  
  391.     move.l    4(a0),d7        ; xfdbi_SourceBufLen
  392.  
  393.     movem.l    d0-a6,-(sp)
  394.     move.l    a0,a6
  395.     move.l    0(a0),a0        ; xfdbi_SourceBuffer
  396.  
  397.  
  398.     move.l    8(a0),d0
  399.     lsl.l    #2,d0
  400.     lea.l    $14(a0,d0.l),a0
  401.  
  402.     cmp.w    #$3ea,2(a0)        ; DATA
  403.     beq.b    .okiej
  404.  
  405.     cmp.w    #$3e9,2(a0)        ; CODE
  406.     beq.b    .okiej
  407.  
  408.     movem.l    (sp)+,d0-a6
  409.     bra.w    .cant
  410.  
  411. .okiej:
  412.     addq.l    #4,a0
  413.  
  414.     move.l    a0,a5            ; begin of codehunk
  415.  
  416.  
  417.     ;****** CORRECT HUNKLENGTHs...
  418.  
  419.     move.l    0(a6),a0        ; xfdbi_SourceBuffer
  420.     lea.l    $14(a0),a0
  421.     sub.l    #SMG_size2/4,(a0)
  422.     sub.l    #SMG_size2/4,(a5)
  423.  
  424.     ;****** REPLACE STOLEN INSTRUCTION...
  425.  
  426.     move.l    #$61000002,d1
  427.  
  428.     move.l    a5,a0
  429.     add.l    (a5),a0
  430.     add.l    (a5),a0
  431.     add.l    (a5),a0
  432.     add.l    (a5),a0
  433.  
  434.     move.l    a5,a2            ; BeginOfCodeHunk
  435.  
  436. .restore
  437.     move.l    (a0),d2
  438.     cmp.l    d1,d2
  439.     bne    .none
  440.     
  441.     move.l    #$2c780004,(a0)        ; restore MOVE.L 4.W,A6
  442.  
  443. .none
  444.     addq.l    #2,d1
  445.     subq.l    #2,a0
  446.     cmpa.l    a0,a2
  447.     bne    .restore
  448.  
  449.     ;****** MAKE CLEAN COPY...
  450.  
  451.  
  452.     move.l    4(a6),a2        ; xfdbi_SourceBufLen
  453.     sub.l    #SMG_size2,a2
  454.     add.l    0(a6),a2        ; xfdbi_SourceBuffer
  455.  
  456.     move.l    a5,a0            ; before
  457.     move.l    (a5),d0
  458.     lsl.l    #2,d0
  459.     add.l    d0,a0
  460.     lea.l    SMG_size2(a0),a1    ; after
  461.     addq.l    #4,a1
  462.     addq.l    #4,a0
  463.  
  464. .copy:
  465.     move.l    (a1)+,(a0)+
  466.     cmp.l    a0,a2
  467.     bge.b    .copy
  468.  
  469.     movem.l    (sp)+,d0-a6
  470.  
  471.  
  472.     move.l    4(a0),d0    ; xfdbi_SourceBufLen
  473.     sub.l    #SMG_size2,d0
  474.     move.l    d0,32(a0)    ; xfdbi_TargetBufSaveLen
  475.  
  476.     move.l    60(a0),a1    ; xfdbi_UserTargetBuf
  477.  
  478.     btst.b    #3,49(a0)    ; XFDFB_USERTARGET,1+xfdbi_Flags
  479.     bne.b    .CopyMem
  480.  
  481.     move.w    #1,18(a0)    ; XFDERR_NOMEMORY,xfdbi_Error
  482.  
  483.     move.l    d0,28(a0)    ; xfdbi_TargetBufLen
  484.  
  485.     move.l    4.w,a6        ; execbase
  486.     
  487.     move.l    24(a0),d1    ; xfdbi_TargetBufMemType
  488.     
  489.     move.l    a0,-(sp)
  490.     jsr    -198(a6)    ; AllocMem
  491.     move.l    (sp)+,a0
  492.  
  493.     move.l    d0,a1
  494.     move.l    d0,20(a0)    ; xfdbi_TargetBuffer
  495.     beq.b    .Cant
  496.  
  497. .CopyMem:
  498.     clr.w    18(a0)        ; xfdbi_Error
  499.     
  500.     move.l    32(a0),d0    ; xfdbi_TargetBufSaveLen
  501.     move.l    0(a0),a0    ; xfdbi_SourceBuffer
  502.     jsr    -624(a6)    ; CopyMem
  503.  
  504.     moveq    #1,d0
  505.     movem.l    (sp)+,d2-d7/a0-a6
  506.     rts
  507. .cant:
  508.     movem.l    (sp)+,d2-d7/a0-a6
  509.     rts
  510.  
  511.  
  512.  
  513. ;--------------------------------------------------------------------
  514. ;--------------------------------------------------------------------
  515.  
  516. RemSMG:
  517.     movem.l    d2-d7/a0-a6,-(sp)
  518.  
  519.     moveq    #0,d0
  520.  
  521.     move.l    4(a0),d7        ; xfdbi_SourceBufLen
  522.  
  523.     movem.l    d0-a6,-(sp)
  524.     move.l    a0,a6
  525.     move.l    0(a0),a0        ; xfdbi_SourceBuffer
  526.  
  527.  
  528.     move.l    8(a0),d0
  529.     lsl.l    #2,d0
  530.     lea.l    $14(a0,d0.l),a0
  531.  
  532.     cmp.w    #$3ea,2(a0)        ; DATA
  533.     beq.b    .okiej
  534.  
  535.     cmp.w    #$3e9,2(a0)        ; CODE
  536.     beq.b    .okiej
  537.  
  538.     movem.l    (sp)+,d0-a6
  539.     bra.w    .cant
  540.  
  541. .okiej:
  542.     addq.l    #4,a0
  543.  
  544.     move.l    a0,a5            ; begin of codehunk
  545.  
  546.  
  547.     ;****** CORRECT HUNKLENGTHs...
  548.  
  549.     move.l    0(a6),a0        ; xfdbi_SourceBuffer
  550.     lea.l    $14(a0),a0
  551.     sub.l    #SMG_size/4,(a0)
  552.     sub.l    #SMG_size/4,(a5)
  553.  
  554.     ;****** REPLACE STOLEN INSTRUCTION...
  555.  
  556.     move.l    #$61000002,d1
  557.  
  558.     move.l    a5,a0
  559.     add.l    (a5),a0
  560.     add.l    (a5),a0
  561.     add.l    (a5),a0
  562.     add.l    (a5),a0
  563.  
  564.     move.l    a5,a2            ; BeginOfCodeHunk
  565.  
  566. .restore
  567.     move.l    (a0),d2
  568.     cmp.l    d1,d2
  569.     bne    .none
  570.     
  571.     move.l    #$2c780004,(a0)        ; restore MOVE.L 4.W,A6
  572.  
  573. .none
  574.     addq.l    #2,d1
  575.     subq.l    #2,a0
  576.     cmpa.l    a0,a2
  577.     bne    .restore
  578.  
  579.     ;****** MAKE CLEAN COPY...
  580.  
  581.  
  582.     move.l    4(a6),a2        ; xfdbi_SourceBufLen
  583.     sub.l    #SMG_size,a2
  584.     add.l    0(a6),a2        ; xfdbi_SourceBuffer
  585.  
  586.     move.l    a5,a0            ; before
  587.     move.l    (a5),d0
  588.     lsl.l    #2,d0
  589.     add.l    d0,a0
  590.     lea.l    SMG_size(a0),a1    ; after
  591.     addq.l    #4,a1
  592.     addq.l    #4,a0
  593.  
  594. .copy:
  595.     move.l    (a1)+,(a0)+
  596.     cmp.l    a0,a2
  597.     bge.b    .copy
  598.  
  599.     movem.l    (sp)+,d0-a6
  600.  
  601.  
  602.     move.l    4(a0),d0    ; xfdbi_SourceBufLen
  603.     sub.l    #SMG_size,d0
  604.     move.l    d0,32(a0)    ; xfdbi_TargetBufSaveLen
  605.  
  606.     move.l    60(a0),a1    ; xfdbi_UserTargetBuf
  607.  
  608.     btst.b    #3,49(a0)    ; XFDFB_USERTARGET,1+xfdbi_Flags
  609.     bne.b    .CopyMem
  610.  
  611.     move.w    #1,18(a0)    ; XFDERR_NOMEMORY,xfdbi_Error
  612.  
  613.     move.l    d0,28(a0)    ; xfdbi_TargetBufLen
  614.  
  615.     move.l    4.w,a6        ; execbase
  616.     
  617.     move.l    24(a0),d1    ; xfdbi_TargetBufMemType
  618.     
  619.     move.l    a0,-(sp)
  620.     jsr    -198(a6)    ; AllocMem
  621.     move.l    (sp)+,a0
  622.  
  623.     move.l    d0,a1
  624.     move.l    d0,20(a0)    ; xfdbi_TargetBuffer
  625.     beq.b    .Cant
  626.  
  627.  
  628. .CopyMem:
  629.     clr.w    18(a0)        ; xfdbi_Error
  630.     
  631.     move.l    32(a0),d0    ; xfdbi_TargetBufSaveLen
  632.     move.l    0(a0),a0    ; xfdbi_SourceBuffer
  633.     jsr    -624(a6)    ; CopyMem
  634.  
  635.  
  636.     moveq    #1,d0
  637.     movem.l    (sp)+,d2-d7/a0-a6
  638.     rts
  639.  
  640.  
  641. .cant:
  642.     movem.l    (sp)+,d2-d7/a0-a6
  643.     rts
  644.  
  645.  
  646.